//============================================================================================
/**
 * @file	ld_main.h
 * @brief	伝説デモ画面・共通
 * @author	Hiroyuki Nakamura
 * @date	09.01.21
 */
//============================================================================================
#ifndef LD_MAIN_H
#define	LD_MAIN_H

#include "demo/legend_demo.h"
//#include "../../field/motion_bl.h"


//============================================================================================
//	定数定義
//============================================================================================

// アニメテーブルインデックス
enum {
	LD_SCENE_ANM_ICA = 0,
	LD_SCENE_ANM_IMA,
	LD_SCENE_ANM_ITA,
	LD_SCENE_ANM_ITP,
	LD_SCENE_ANM_MAX,
};

// シーンデータ
typedef struct {
	NNSG3dRenderObj	rendObj;
	NNSG3dResMdl * mdl;
	NNSG3dResFileHeader * rh;
	void * anmMem[LD_SCENE_ANM_MAX];
	NNSG3dAnmObj * anmObj[LD_SCENE_ANM_MAX];
}LD_SCENE_DATA;

// モーションブラー初期化パラメータ
typedef struct {
	// グラフィックモード
	GXDispMode dispMode;	// ディスプレイモード
	GXBGMode bgMode;		// BGモード
	GXBG0As bg0_2d3d;		// BG0を3dに使用するか

	// キャプチャ
	GXCaptureSize sz;		// キャプチャサイズ
    GXCaptureMode mode;		// キャプチャモード
    GXCaptureSrcA a;		// キャプチャ先A
    GXCaptureSrcB b;		// キャプチャ先B
    GXCaptureDest dest;		// キャプチャデータ転送Vram
    int eva;				// ブレンド係数A
    int evb;				// ブレンド係数B

	int heap_id;			// 使用するヒープID
}LDMAIN_MBL_PARAM;

// モーションブラータスクワーク
typedef struct {
	GXVRamLCDC			lcdc;		// 元のLCDC
	LDMAIN_MBL_PARAM	data;		// モーションブラー初期化パラメータ
	BOOL				init_flg;
	TCB_PTR				tcb;
}LDMAIN_MBL_WORK;

// 伝説デモワーク
typedef struct {
	LEGEND_DEMO_DATA * dat;

	LDMAIN_MBL_WORK * mb;

	NNSFndAllocator	allocator;
	GF_CAMERA_PTR	camera;		// カメラ
	LD_SCENE_DATA	scene[8];	// シーンデータ
	u32	scene_max;				// シーンデータ数

	VecFx32 target;

	int	main_seq;
	int	next_seq;

	u32	cnt;		// カウンタ

	void * work;	// 各アプリで使用するワーク（確保・解放は各アプリで）

}LEGEND_DEMO_WORK;

typedef int (*pLegendDemoFunc)(LEGEND_DEMO_WORK*);

// リソースデータテーブル
typedef struct {
	u32	imd;
	u8	anm[4];
	BOOL	glstFlag;
}LD_RES_TBL;

// カメラデータ
typedef struct {
	GF_CAMERA_PARAM	prm;
	VecFx32	target;
	fx32	near;
	fx32	far;
}LD_CAMERA_DATA;

#define	LD_RES_DUMMY	( 0xff )		// リソースダミーデータ


//============================================================================================
//	プロトタイプ宣言
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 共通初期化
 *
 * @param	wk		伝説デモワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_CommInit( LEGEND_DEMO_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * 共通解放処理
 *
 * @param	wk		伝説デモワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_CommRelease( LEGEND_DEMO_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * フェードインセット
 *
 * @param	wk		伝説デモワーク
 * @param	div		分割数
 * @param	sync	分割されたフレームのウェイト数
 * @param	next	フェード後のシーケンス
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_FadeInSet( LEGEND_DEMO_WORK * wk, int div, int sync, int next );

//--------------------------------------------------------------------------------------------
/**
 * フェードアウトセット
 *
 * @param	wk		伝説デモワーク
 * @param	div		分割数
 * @param	sync	分割されたフレームのウェイト数
 * @param	next	フェード後のシーケンス
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_FadeOutSet( LEGEND_DEMO_WORK * wk, int div, int sync, int next );

//--------------------------------------------------------------------------------------------
/**
 * ホワイトインセット
 *
 * @param	wk		伝説デモワーク
 * @param	div		分割数
 * @param	sync	分割されたフレームのウェイト数
 * @param	next	フェード後のシーケンス
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_WhiteInSet( LEGEND_DEMO_WORK * wk, int div, int sync, int next );

//--------------------------------------------------------------------------------------------
/**
 * ホワイトアウトセット
 *
 * @param	wk		伝説デモワーク
 * @param	div		分割数
 * @param	sync	分割されたフレームのウェイト数
 * @param	next	フェード後のシーケンス
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_WhiteOutSet( LEGEND_DEMO_WORK * wk, int div, int sync, int next );

//--------------------------------------------------------------------------------------------
/**
 * カメラ設定
 *
 * @param	wk		伝説デモワーク
 * @param	dat		カメラデータ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_InitCamera( LEGEND_DEMO_WORK * wk, const LD_CAMERA_DATA * dat );

//--------------------------------------------------------------------------------------------
/**
 * ライト初期化
 *
 * @param	none
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_InitLight(void);

//--------------------------------------------------------------------------------------------
/**
 * ライト設定
 *
 * @param	gst		ライトデータ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_SetLight( GLST_DATA * gst );

//--------------------------------------------------------------------------------------------
/**
 * エッジマーキング設定
 *
 * @param	rgb		カラーテーブル
 *
 * @return	none
 *
 * @li	rgb = NULL でエッジマーキング無効
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_EdgeMarkingSet( const GXRgb * rgb );

//--------------------------------------------------------------------------------------------
/**
 * ３Ｄモデルデータ読み込み
 *
 * @param	wk			伝説デモワーク
 * @param	arcIndex	アークインデックス
 * @param	tbl			シーンリソースデータテーブル
 * @param	max			シーンリソースデータ数
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_Load3DData( LEGEND_DEMO_WORK * wk, u32 arcIndex, const LD_RES_TBL * tbl, u32 max );

//--------------------------------------------------------------------------------------------
/**
 * ３Ｄモデルデータ削除
 *
 * @param	wk			伝説デモワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_Delete3DData( LEGEND_DEMO_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * ３Ｄモデル表示
 *
 * @param	wk			伝説デモワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_Draw3DMain( LEGEND_DEMO_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * ３Ｄモデルアニメチェック（個別）
 *
 * @param	wk		伝説デモワーク
 * @param	id		モデルＩＤ
 *
 * @retval	"TRUE = アニメ中"
 * @retval	"FALSE = それ以外"
 */
//--------------------------------------------------------------------------------------------
extern BOOL LDMAIN_ObjAnmCheck( LEGEND_DEMO_WORK * wk, u32 id );

//--------------------------------------------------------------------------------------------
/**
 * ３Ｄモデルアニメチェック（全体）
 *
 * @param	wk		伝説デモワーク
 *
 * @retval	"TRUE = アニメ中"
 * @retval	"FALSE = それ以外"
 */
//--------------------------------------------------------------------------------------------
extern BOOL LDMAIN_AllObjAnmCheck( LEGEND_DEMO_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * モーションブラー初期化
 *
 * @param	eva		ブレンド係数A
 * @param	evb		ブレンド係数B
 *
 * @return	FLD_MOTION_BL_PTR	モーションブラーポインタ
 */
//--------------------------------------------------------------------------------------------
extern LDMAIN_MBL_WORK * LDMAIN_MotionBlInit( int eva, int evb );

//--------------------------------------------------------------------------------------------
/**
 * モーションブラー削除
 *
 * @param	mbl		モーションブラーポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void LDMAIN_MotionBlExit( LDMAIN_MBL_WORK * mb );



#ifdef PM_DEBUG
extern void LDMAIN_DebugObjAnmClear( LEGEND_DEMO_WORK * wk );
extern BOOL LDMAIN_DebugMainControl( LEGEND_DEMO_WORK * wk );
#endif	// PM_DEBUG



#endif	// LD_MAIN_H